package com.lsh.repository;

import com.lsh.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

/**
 * @author ：LiuShihao
 * @date ：Created in 2021/2/1 9:03 下午
 * @desc ：
 * 在@Query中使用本地查询，当然，你需要设置nativeQuery=true，必须说明的是，这样的话，就不再支持分页以及排序。
 */
@Transactional
public interface UserRepository extends JpaRepository<User,Integer>, JpaSpecificationExecutor<User> {

    /**
     * 模糊查询 %?1%查询所有包含关键字的数据    %?1：只查询以关键字结尾的数据   ?1%：只查询以关键字开头的数据
     * @param nameKetWorld
     * @return
     */
    @Query(value = "select * from User u where u.name like %?1%",nativeQuery = true)
    List<User> findQueryLike(String nameKetWorld);

    /**
     * 自定义SQL分页查询Pageable
     * @param pageable
     * @return
     */
    @Query(value = "SELECT  * FROM User  u " ,nativeQuery = true)
//    List<User> findQueryPage(Pageable pageable);
    Page<User> findQueryPage(Pageable pageable);

    /**
     * 使用@Param 注解绑定参数
     * @param name
     * @param birthday
     * @return
     */
    @Query(value = "SELECT  * FROM User u WHERE u.name like %:name% AND u.birthday like %:birthday%" ,nativeQuery = true)
    List<User> findUserByNameAndLikeBirthday(@Param("name") String name, @Param("birthday") String birthday);

    /**
     * 使用EL表达式  \
     * 注意：表名使用的就是#{#entityName}  ；#{#User}查询报错
     *
     * @return
     */
    @Query(value = "SELECT  * FROM #{#entityName} " ,nativeQuery = true)
//    @Query(value = "SELECT  * FROM #{#User} " ,nativeQuery = true)
    List<User> findALL();

    /**
     * JPA更新、插入、删除，需要加@Modifying注解和事务注解@Transactional（业务层）
     * @param name
     * @param password
     * @param id
     * @return
     */
    @Modifying
    @Query("update #{#entityName} u set u.name = ?1 , u.password = ?2 WHERE u.id = ?3")
    int updateUserNameAndPassword(String name, String password,int id);



}
